package map;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

/*
* java.util.Map接口 称为：查找表
* Map是java中一种常用的数据结构，体现的是一个多行两列的表格
* 其中左列称为key，右列称为value
* Map总是根据key获取对应的value
* Map是java集合框架(Java Collection Framework)的一员
* 但是Map不是集合，它与Collection不存在继承关系
* 常用的实现类：
* java.util.HashMap:散列表，哈希表。最常用的Map实现表
* 特点：当今查询速度最快的数据结构
* java.util.TreeMap:使用二叉树实现的Map
*
* */
public class MapDemo {
    public static void main(String[] args) {
//        HashMap内部存放顺序与put顺序不一致
//        Map<String,Integer> map = new HashMap<>(); //{物理=98, 生物=95, 数学=86, 化学=93, 语文=99, 英语=90}
//        LinkedHashMap内部维护一个链表来记录put顺序，以使我们遍历时按照put顺序进行
        Map<String,Integer> map = new LinkedHashMap<>(); //{语文=99, 数学=86, 英语=90, 物理=98, 化学=93, 生物=95}
        /*
        * v put(K k,V v)
        * 将一组键值对存入Map中
        * Map有一个要求：key不允许重复(equals比较)
        * 如果使用重复的key保存value则是替换value操作，此时方法返回值为被替换的value.没有替换时返回值为null.
        * */
        Integer value = map.put("语文",99); //不能用int接收 会报空指针异常 由于自动拆装箱特性
        System.out.println(value); //null
        map.put("数学",86);
        map.put("英语",90);
        map.put("物理",98);
        map.put("化学",93);
        map.put("生物",95);
        value = map.put("数学",97);
        System.out.println(value); //86
        System.out.println(map);
        /*
        * V get(Object key)
        * 根据给定的key获取对应的value
        * 如果给定的key在map中不存在，则返回值为null*/
        value = map.get("语文");
        System.out.println("语文："+value);
        value = map.get("体育");
        System.out.println("体育："+value);
        /*int size()
        * 返回当前Map中的元素个数。每一组键值对为一个元素*/
        int size = map.size();
        System.out.println("size："+size);
        /*
        * boolean containsKey(Object key)
        * 判断当前Map是否包含给定的key
        * boolean containsValue(Object value)
        * 判断当前Map是否包含给定的value
        * */
        boolean ck = map.containsKey("语文");
        System.out.println("是否包含key[语文]"+ck);
        ck = map.containsKey("体育");
        System.out.println("是否包含key[体育]"+ck);
        boolean cv = map.containsValue(99);
        System.out.println("是否包含value[99]"+cv);
        cv = map.containsValue(80);
        System.out.println("是否包含value[80]"+cv);
        /*
        * V remove(Object key)
        * 删除当前Map中给定的key所对应的键值对。返回值为这个key对应的value
        * */
        value = map.remove("数学");
        System.out.println(value); //97
        System.out.println(map); //{语文=99, 英语=90, 物理=98, 化学=93, 生物=95}
    }
}
